﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PlutoStudio.Domain.Entities.Auditing
{
    public abstract class FullAuditedEntity : FullAuditedEntity<int>,IEntity
    {

    }

    public abstract class FullAuditedEntity<TKey> : FullAuditedEntity<TKey, int>, IFullAudited
    {

    }
    public abstract class FullAuditedEntity<TKey, TUserKey> : AuditedEntity<TKey, TUserKey>, IFullAudited<TUserKey>
        where TUserKey : struct
    {
        public virtual TUserKey? DeleterUserId { get; set; }
        public virtual DateTime? DeletionTime { get; set; }
        public virtual bool IsDeleted { get; set; }
    }

    public abstract class FullAuditedEntity<TKey, TUser, TUserKey> : FullAuditedEntity<TKey, TUserKey>, IAudited<TUser, TUserKey>, IFullAudited<TUser, TUserKey>
        where TUserKey : struct
        where TUser : IEntity<TUserKey>
    {
        public virtual TUser CreatorUser { get;set; }
        public virtual TUser LastModifierUser { get; set; }
        public virtual TUser DeleterUser { get;set; }
    }
}
